package cn.org.cute.ebocy.util;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

/**
 * 读取 key = value 形式的配置文件。可读取给定字符串，也可以读取文件。
 */

public class IniReader{
	
	public final static char CHAR_EQUAL = '=';
    
	private SpeedSearcher<String[]> searcher;

    public IniReader(File f)throws IOException{
    	
    	this(f, null);
    	
    }
    /**
     * Constructor.
     * @param f 配置文件
     */
    public IniReader(File f, String encode)throws IOException{
    	
    	ArrayList<String> al = NormalUtil.readTextFileInLine(f, encode);
    	
    	parse(al);
    	
    }

    private void parse(ArrayList<String> al){
    	
    	ArrayList<String[]> pairs = new ArrayList<String[]>();
    	
    	String[] temp = null;
    	
    	for(String line : al){
    		
    		temp = parsePair(line);
    		if(temp != null){
    			pairs.add(temp);
    		}
    		    		
    	}
    	
    	searcher = new SpeedSearcher<String[]>(pairs, new Searchable<String, String[]>(){
    												public String getKey(String[] obj){
    													return obj[0];
    												}
    											});
    	
    }
    
    private String[] parsePair(String str){
    	
    	if(NormalUtil.isBlank(str)){
    		return null;
    	}
    	
    	int p = str.indexOf(CHAR_EQUAL);
    	if(p<0){
    		return null;
    	}
    	
    	return new String[]{NormalUtil.trim(str.substring(0,p)), NormalUtil.trim(str.substring(p+1))};    	
    	
    }
    
    
    /**
     * 获得键对应的值。
     * @param key 键名
     * @return 配置内容中的对应的值
     */
    public String get(String key){
    	
    	if(key==null){
    		return null;
    	}
    	
    	String[] pair = (String[]) searcher.get(key);
    	return pair == null ? null : pair[1];
    
    }
    
    public String[] keys(){
    
    	return searcher.keys();
    
    }
    
    public Object[] getAllSet(){
    	
    	return searcher.values();
    
    }    
    
}
